package com.mccrea.principle.ocp;

/**
 * @Classname OcpAppmain
 * @Description 分析：
 * 优点：比较好理解，易于操作。
 * 缺点：违反了设计模式的ocp原则，即对扩展开放，对修改关闭。当我们给类增加新功能时，尽量不修改代码，或者尽可能少修改代码；
 *      这个例子，假如我们需要增加一个新的图形，就需要修改很多地方，新增类，GraphicEditor.drawShape()增加分支条件。
 * 改进思路：将Shape类做成抽象类，并且提供一个抽象draw方法，让子类去实现即可。新增的图形只要实现这个抽象类，调用方不用修改代码
 * @Date 2021/5/6 0006 18:30
 * @Created by Mccrea_Gao
 * @see com.mccrea.principle.ocp.improve.OcpAppmain
 */
public class OcpAppmain {
    public static void main(String[] args) {
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Rectangle());
    }
}


class GraphicEditor {
    public void drawShape(Shape shape) {
        if (shape.type == 1) {
            drawCircle();
        } else if (shape.type == 2) {
            drawRectangle();
        }
    }

    private void drawCircle() {
        System.out.println("绘制圆形");
    }

    private void drawRectangle() {
        System.out.println("绘制矩形");
    }
}

class Shape {
    int type;
}


class Circle extends Shape {
    public Circle() {
        super.type = 1;
    }
}

class Rectangle extends Shape {
    public Rectangle() {
        super.type = 2;
    }
}